package com.hui.qiniucloud.service;

import com.hui.qiniucloud.dto.ImageGenerateRequest;
import com.hui.qiniucloud.dto.ImageGenerateResponse;
import com.hui.qiniucloud.entity.AICharacter;
import reactor.core.publisher.Mono;

import java.util.List;
import java.util.Map;

/**
 * 豆包通用服务接口
 * 
 * @author huihui
 * @since 2025-09-28
 */
public interface IDoubaoUniversalService {

    /**
     * 通用聊天接口 - 非流式响应
     * @param message 用户消息
     * @return AI回复内容
     */
    Mono<String> chat(String message);

    /**
     * 带系统提示的聊天接口
     * @param message 用户消息
     * @param systemPrompt 系统提示词
     * @return AI回复内容
     */
    Mono<String> chatWithSystem(String message, String systemPrompt);

    /**
     * 带历史记录的聊天接口
     * @param message 用户消息
     * @param systemPrompt 系统提示词（可选）
     * @param chatHistory 聊天历史记录
     * @return AI回复内容
     */
    Mono<String> chat(String message, String systemPrompt, List<Map<String, String>> chatHistory);

    /**
     * 自定义模型和参数的聊天接口
     * @param message 用户消息
     * @param systemPrompt 系统提示词
     * @param chatHistory 聊天历史
     * @param model 模型名称
     * @param temperature 温度参数(0-1)
     * @param maxTokens 最大token数
     * @return AI回复内容
     */
    Mono<String> chatWithCustomParams(String message, String systemPrompt,
                                    List<Map<String, String>> chatHistory,
                                    String model, Double temperature, Integer maxTokens);

    /**
     * 角色扮演聊天接口
     * @param message 用户消息
     * @param character 角色信息
     * @return AI回复内容
     */
    Mono<String> chatWithCharacter(String message, AICharacter character);

    /**
     * 带历史记录的角色扮演聊天接口
     * @param message 用户消息
     * @param character 角色信息
     * @param chatHistory 聊天历史记录
     * @return AI回复内容
     */
    Mono<String> chatWithCharacter(String message, AICharacter character, List<Map<String, String>> chatHistory);

    /**
     * 文生图接口
     * @param request 文生图请求
     * @return 文生图响应
     */
    Mono<ImageGenerateResponse> generateImage(ImageGenerateRequest request);

    /**
     * 检查服务可用性
     * @return 服务是否可用
     */
    Mono<Boolean> checkHealth();
}